#include <bits/stdc++.h>
using namespace std;

const int N = 10010;
// class Solution
// {
//   public:
//     string mem[N][N];
//     string LCS(string s1, string s2)
//     {
//         string ans = dfs(s1.size(), s2.size(), s1, s2);
//         return ans.empty() ? "-1" : ans;
//     }
//     string dfs(int i, int j, string &s1, string &s2)
//     {
//         if (i == 0 || j == 0)
//         {
//             return "";
//         }
//         if (mem[i][j] != "")
//         {
//             return mem[i][j];
//         }
//         if (s1[i - 1] == s2[j - 1])
//         {
//             return mem[i][j] = dfs(i - 1, j - 1, s1, s2) + s1[i - 1];
//         }
//         else
//         {
//             string a = dfs(i - 1, j, s1, s2);
//             string b = dfs(i, j - 1, s1, s2);
//             return mem[i][j] = a.size() > b.size() ? a : b;
//         }
//     }
// };

// class Solution
// {
//   public:
//     string LCS(string s1, string s2)
//     {
//         if (s1.empty() || s2.empty())
//             return "-1";

//         // 创建并初始化 DP 表
//         vector<vector<int>> dp(s1.size() + 1, vector<int>(s2.size() + 1, 0));

//         // 填充 DP 表
//         for (int i = 1; i <= s1.size(); ++i)
//         {
//             for (int j = 1; j <= s2.size(); ++j)
//             {
//                 if (s1[i - 1] == s2[j - 1])
//                 {
//                     dp[i][j] = dp[i - 1][j - 1] + 1;
//                 }
//                 else
//                 {
//                     dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
//                 }
//             }
//         }

//         // 反向构造 LCS
//         string res;
//         int i = s1.size(), j = s2.size();
//         while (i > 0 && j > 0)
//         {
//             if (s1[i - 1] == s2[j - 1])
//             {
//                 res.push_back(s1[i - 1]);
//                 --i;
//                 --j;
//             }
//             else if (dp[i - 1][j] >= dp[i][j - 1])
//             {
//                 --i;
//             }
//             else
//             {
//                 --j;
//             }
//         }

//         if (res.empty())
//             return "-1";

//         reverse(res.begin(), res.end());
//         return res;
//     }
// };



class Solution 
{
public:
    string LCS(string s1, string s2)
    {
        vector<vector<int>> dp(s1.size() + 1, vector<int>(s2.size() + 1));
        for (int i = 1; i <= s1.size(); i++)
        {
            for (int j = 1; j <= s2.size(); j++)
            {
                if (s1[i - 1] == s2[j - 1])
                {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                }
                else
                {
                    dp[i][j] = max(dp[i- 1][j], dp[i][j - 1]);
                }
            }
        }

        //反向构造
        string res;
        int i = s1.size(), j = s2.size();
        while (i != 0 && j != 0)
        {
            if (s1[i - 1] == s2[j - 1])
            {
                res.push_back(s1[i - 1]);
                --i;
                --j;
            }
            else if (dp[i - 1][j] >= dp[i][j - 1])
            {
                i--;
            }
            else
            {
                j--;
            }
        }
        if (res.empty())
            return "-1";
        reverse(res.begin(), res.end());
        return res;
    }
};